home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 July: Mac OS SDK / Dev.CD Jul 00 SDK2.toast / Development Kits / Cross Platform / QuickTime 4.1.2 Windows SDK / CIncludes / Threads.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-12  |  12.4 KB  |  379 lines  |  [TEXT/R*ch]

  1. /*
  2.      File:        Threads.h
  3.  
  4.      Contains:    Thread Manager Interfaces.
  5.  
  6.      Version:    Technology:    Mac OS 8
  7.                  Release:    QuickTime 4.1
  8.  
  9.      Copyright:    (c) 1991-1999 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:        For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __THREADS__
  18. #define __THREADS__
  19.  
  20. #ifndef __MACTYPES__
  21.     #include <MacTypes.h>
  22. #endif
  23.  
  24. #ifndef __MIXEDMODE__
  25.     #include <MixedMode.h>
  26. #endif
  27.  
  28. #ifndef __MACERRORS__
  29.     #include <MacErrors.h>
  30. #endif
  31.  
  32.  
  33.  
  34.  
  35. #if PRAGMA_ONCE
  36. #pragma once
  37. #endif
  38.  
  39. #ifdef __cplusplus
  40. extern "C" {
  41. #endif
  42.  
  43. #if PRAGMA_IMPORT
  44. #pragma import on
  45. #endif
  46.  
  47. #if PRAGMA_STRUCT_ALIGN
  48.     #pragma options align=mac68k
  49. #elif PRAGMA_STRUCT_PACKPUSH
  50.     #pragma pack(push, 2)
  51. #elif PRAGMA_STRUCT_PACK
  52.     #pragma pack(2)
  53. #endif
  54.  
  55. /* Thread states*/
  56.  
  57. typedef UInt16 ThreadState;
  58. enum {
  59.     kReadyThreadState            = 0,
  60.     kStoppedThreadState            = 1,
  61.     kRunningThreadState            = 2
  62. };
  63.  
  64. /* Error codes have been meoved to Errors.(pah)*/
  65.  
  66. /* Thread environment characteristics*/
  67. typedef void *                            ThreadTaskRef;
  68. /* Thread characteristics*/
  69.  
  70. typedef UInt32 ThreadStyle;
  71. enum {
  72.     kCooperativeThread            = 1L << 0,
  73.     kPreemptiveThread            = 1L << 1
  74. };
  75.  
  76. /* Thread identifiers*/
  77.  
  78. typedef UInt32 ThreadID;
  79. enum {
  80.     kNoThreadID                    = 0,
  81.     kCurrentThreadID            = 1,
  82.     kApplicationThreadID        = 2
  83. };
  84.  
  85. /* Options when creating a thread*/
  86.  
  87. typedef UInt32 ThreadOptions;
  88. enum {
  89.     kNewSuspend                    = (1 << 0),
  90.     kUsePremadeThread            = (1 << 1),
  91.     kCreateIfNeeded                = (1 << 2),
  92.     kFPUNotNeeded                = (1 << 3),
  93.     kExactMatchThread            = (1 << 4)
  94. };
  95.  
  96. /* Information supplied to the custom scheduler*/
  97.  
  98. struct SchedulerInfoRec {
  99.     UInt32                             InfoRecSize;
  100.     ThreadID                         CurrentThreadID;
  101.     ThreadID                         SuggestedThreadID;
  102.     ThreadID                         InterruptedCoopThreadID;
  103. };
  104. typedef struct SchedulerInfoRec            SchedulerInfoRec;
  105. typedef SchedulerInfoRec *                SchedulerInfoRecPtr;
  106.  
  107. /*
  108.     The following ProcPtrs cannot be interchanged with UniversalProcPtrs because
  109.     of differences between 680x0 and PowerPC runtime architectures with regard to
  110.     the implementation of the Thread Manager.
  111.  */
  112.  
  113. typedef void *                            voidPtr;
  114. /* Prototype for thread's entry (main) routine*/
  115. typedef CALLBACK_API( voidPtr , ThreadEntryProcPtr )(void *threadParam);
  116. /* Prototype for custom thread scheduler routine*/
  117. typedef CALLBACK_API( ThreadID , ThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  118. /* Prototype for custom thread switcher routine*/
  119. typedef CALLBACK_API( void , ThreadSwitchProcPtr )(ThreadID threadBeingSwitched, void *switchProcParam);
  120. /* Prototype for thread termination notification routine*/
  121. typedef CALLBACK_API( void , ThreadTerminationProcPtr )(ThreadID threadTerminated, void *terminationProcParam);
  122. /* Prototype for debugger NewThread notification*/
  123. typedef CALLBACK_API( void , DebuggerNewThreadProcPtr )(ThreadID threadCreated);
  124. /* Prototype for debugger DisposeThread notification*/
  125. typedef CALLBACK_API( void , DebuggerDisposeThreadProcPtr )(ThreadID threadDeleted);
  126. /* Prototype for debugger schedule notification*/
  127. typedef CALLBACK_API( ThreadID , DebuggerThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  128. typedef TVECTOR_UPP_TYPE(ThreadEntryProcPtr)                     ThreadEntryUPP;
  129. typedef TVECTOR_UPP_TYPE(ThreadSchedulerProcPtr)                 ThreadSchedulerUPP;
  130. typedef TVECTOR_UPP_TYPE(ThreadSwitchProcPtr)                     ThreadSwitchUPP;
  131. typedef TVECTOR_UPP_TYPE(ThreadTerminationProcPtr)                 ThreadTerminationUPP;
  132. typedef TVECTOR_UPP_TYPE(DebuggerNewThreadProcPtr)                 DebuggerNewThreadUPP;
  133. typedef TVECTOR_UPP_TYPE(DebuggerDisposeThreadProcPtr)             DebuggerDisposeThreadUPP;
  134. typedef TVECTOR_UPP_TYPE(DebuggerThreadSchedulerProcPtr)         DebuggerThreadSchedulerUPP;
  135. #if OPAQUE_UPP_TYPES
  136.     EXTERN_API(ThreadEntryUPP)
  137.     NewThreadEntryUPP               (ThreadEntryProcPtr        userRoutine);
  138.  
  139.     EXTERN_API(ThreadSchedulerUPP)
  140.     NewThreadSchedulerUPP           (ThreadSchedulerProcPtr    userRoutine);
  141.  
  142.     EXTERN_API(ThreadSwitchUPP)
  143.     NewThreadSwitchUPP               (ThreadSwitchProcPtr        userRoutine);
  144.  
  145.     EXTERN_API(ThreadTerminationUPP)
  146.     NewThreadTerminationUPP           (ThreadTerminationProcPtr userRoutine);
  147.  
  148.     EXTERN_API(DebuggerNewThreadUPP)
  149.     NewDebuggerNewThreadUPP           (DebuggerNewThreadProcPtr userRoutine);
  150.  
  151.     EXTERN_API(DebuggerDisposeThreadUPP)
  152.     NewDebuggerDisposeThreadUPP       (DebuggerDisposeThreadProcPtr userRoutine);
  153.  
  154.     EXTERN_API(DebuggerThreadSchedulerUPP)
  155.     NewDebuggerThreadSchedulerUPP    (DebuggerThreadSchedulerProcPtr userRoutine);
  156.  
  157.     EXTERN_API(void)
  158.     DisposeThreadEntryUPP           (ThreadEntryUPP            userUPP);
  159.  
  160.     EXTERN_API(void)
  161.     DisposeThreadSchedulerUPP       (ThreadSchedulerUPP        userUPP);
  162.  
  163.     EXTERN_API(void)
  164.     DisposeThreadSwitchUPP           (ThreadSwitchUPP            userUPP);
  165.  
  166.     EXTERN_API(void)
  167.     DisposeThreadTerminationUPP       (ThreadTerminationUPP    userUPP);
  168.  
  169.     EXTERN_API(void)
  170.     DisposeDebuggerNewThreadUPP       (DebuggerNewThreadUPP    userUPP);
  171.  
  172.     EXTERN_API(void)
  173.     DisposeDebuggerDisposeThreadUPP    (DebuggerDisposeThreadUPP userUPP);
  174.  
  175.     EXTERN_API(void)
  176.     DisposeDebuggerThreadSchedulerUPP    (DebuggerThreadSchedulerUPP userUPP);
  177.  
  178.     EXTERN_API(voidPtr)
  179.     InvokeThreadEntryUPP           (void *                    threadParam,
  180.                                     ThreadEntryUPP            userUPP);
  181.  
  182.     EXTERN_API(ThreadID)
  183.     InvokeThreadSchedulerUPP       (SchedulerInfoRecPtr        schedulerInfo,
  184.                                     ThreadSchedulerUPP        userUPP);
  185.  
  186.     EXTERN_API(void)
  187.     InvokeThreadSwitchUPP           (ThreadID                threadBeingSwitched,
  188.                                     void *                    switchProcParam,
  189.                                     ThreadSwitchUPP            userUPP);
  190.  
  191.     EXTERN_API(void)
  192.     InvokeThreadTerminationUPP       (ThreadID                threadTerminated,
  193.                                     void *                    terminationProcParam,
  194.                                     ThreadTerminationUPP    userUPP);
  195.  
  196.     EXTERN_API(void)
  197.     InvokeDebuggerNewThreadUPP       (ThreadID                threadCreated,
  198.                                     DebuggerNewThreadUPP    userUPP);
  199.  
  200.     EXTERN_API(void)
  201.     InvokeDebuggerDisposeThreadUPP    (ThreadID                threadDeleted,
  202.                                     DebuggerDisposeThreadUPP userUPP);
  203.  
  204.     EXTERN_API(ThreadID)
  205.     InvokeDebuggerThreadSchedulerUPP    (SchedulerInfoRecPtr schedulerInfo,
  206.                                     DebuggerThreadSchedulerUPP userUPP);
  207.  
  208. #else
  209.     #define NewThreadEntryUPP(userRoutine)                            (userRoutine)
  210.     #define NewThreadSchedulerUPP(userRoutine)                        (userRoutine)
  211.     #define NewThreadSwitchUPP(userRoutine)                            (userRoutine)
  212.     #define NewThreadTerminationUPP(userRoutine)                    (userRoutine)
  213.     #define NewDebuggerNewThreadUPP(userRoutine)                    (userRoutine)
  214.     #define NewDebuggerDisposeThreadUPP(userRoutine)                (userRoutine)
  215.     #define NewDebuggerThreadSchedulerUPP(userRoutine)                (userRoutine)
  216.     #define DisposeThreadEntryUPP(userUPP)                             
  217.     #define DisposeThreadSchedulerUPP(userUPP)                         
  218.     #define DisposeThreadSwitchUPP(userUPP)                         
  219.     #define DisposeThreadTerminationUPP(userUPP)                     
  220.     #define DisposeDebuggerNewThreadUPP(userUPP)                     
  221.     #define DisposeDebuggerDisposeThreadUPP(userUPP)                 
  222.     #define DisposeDebuggerThreadSchedulerUPP(userUPP)                 
  223.     #define InvokeThreadEntryUPP(threadParam, userUPP)                 (*userUPP)(threadParam)
  224.     #define InvokeThreadSchedulerUPP(schedulerInfo, userUPP)         (*userUPP)(schedulerInfo)
  225.     #define InvokeThreadSwitchUPP(threadBeingSwitched, switchProcParam, userUPP)  (*userUPP)(threadBeingSwitched, switchProcParam)
  226.     #define InvokeThreadTerminationUPP(threadTerminated, terminationProcParam, userUPP)  (*userUPP)(threadTerminated, terminationProcParam)
  227.     #define InvokeDebuggerNewThreadUPP(threadCreated, userUPP)         (*userUPP)(threadCreated)
  228.     #define InvokeDebuggerDisposeThreadUPP(threadDeleted, userUPP)     (*userUPP)(threadDeleted)
  229.     #define InvokeDebuggerThreadSchedulerUPP(schedulerInfo, userUPP)  (*userUPP)(schedulerInfo)
  230. #endif
  231. /*
  232.    Thread Manager function pointers (TPP):
  233.    on classic 68k use raw function pointers (same as UPP's)
  234.    on classic PowerPC, use raw function pointers
  235.    on CFM-68K, use UPP's
  236.    on Carbon, use UPP's
  237. */
  238.  
  239. #if TARGET_OS_MAC && TARGET_CPU_PPC && !TARGET_API_MAC_CARBON
  240. /* use raw function pointers*/
  241. typedef ThreadEntryProcPtr                 ThreadEntryTPP;
  242. typedef ThreadSchedulerProcPtr             ThreadSchedulerTPP;
  243. typedef ThreadSwitchProcPtr             ThreadSwitchTPP;
  244. typedef ThreadTerminationProcPtr         ThreadTerminationTPP;
  245. typedef DebuggerNewThreadProcPtr         DebuggerNewThreadTPP;
  246. typedef DebuggerDisposeThreadProcPtr     DebuggerDisposeThreadTPP;
  247. typedef DebuggerThreadSchedulerProcPtr     DebuggerThreadSchedulerTPP;
  248. #else
  249. /* use UPP's*/
  250. typedef ThreadEntryUPP                     ThreadEntryTPP;
  251. typedef ThreadSchedulerUPP                 ThreadSchedulerTPP;
  252. typedef ThreadSwitchUPP                 ThreadSwitchTPP;
  253. typedef ThreadTerminationUPP             ThreadTerminationTPP;
  254. typedef DebuggerNewThreadUPP             DebuggerNewThreadTPP;
  255. typedef DebuggerDisposeThreadUPP         DebuggerDisposeThreadTPP;
  256. typedef DebuggerThreadSchedulerUPP         DebuggerThreadSchedulerTPP;
  257. #endif  /* TARGET_OS_MAC && TARGET_CPU_PPC && !TARGET_API_MAC_CARBON */
  258.  
  259. EXTERN_API( OSErr )
  260. NewThread                        (ThreadStyle             threadStyle,
  261.                                  ThreadEntryTPP         threadEntry,
  262.                                  void *                    threadParam,
  263.                                  Size                     stackSize,
  264.                                  ThreadOptions             options,
  265.                                  void **                threadResult,
  266.                                  ThreadID *                threadMade)                            THREEWORDINLINE(0x303C, 0x0E03, 0xABF2);
  267.  
  268. EXTERN_API( OSErr )
  269. SetThreadScheduler                (ThreadSchedulerTPP     threadScheduler)                    THREEWORDINLINE(0x303C, 0x0209, 0xABF2);
  270.  
  271. EXTERN_API( OSErr )
  272. SetThreadSwitcher                (ThreadID                 thread,
  273.                                  ThreadSwitchTPP         threadSwitcher,
  274.                                  void *                    switchProcParam,
  275.                                  Boolean                 inOrOut)                            THREEWORDINLINE(0x303C, 0x070A, 0xABF2);
  276.  
  277. EXTERN_API( OSErr )
  278. SetThreadTerminator                (ThreadID                 thread,
  279.                                  ThreadTerminationTPP     threadTerminator,
  280.                                  void *                    terminationProcParam)                THREEWORDINLINE(0x303C, 0x0611, 0xABF2);
  281.  
  282. EXTERN_API( OSErr )
  283. SetDebuggerNotificationProcs    (DebuggerNewThreadTPP     notifyNewThread,
  284.                                  DebuggerDisposeThreadTPP  notifyDisposeThread,
  285.                                  DebuggerThreadSchedulerTPP  notifyThreadScheduler)            THREEWORDINLINE(0x303C, 0x060D, 0xABF2);
  286.  
  287. EXTERN_API( OSErr )
  288. CreateThreadPool                (ThreadStyle             threadStyle,
  289.                                  SInt16                 numToCreate,
  290.                                  Size                     stackSize)                            THREEWORDINLINE(0x303C, 0x0501, 0xABF2);
  291.  
  292. EXTERN_API( OSErr )
  293. GetFreeThreadCount                (ThreadStyle             threadStyle,
  294.                                  SInt16 *                freeCount)                            THREEWORDINLINE(0x303C, 0x0402, 0xABF2);
  295.  
  296. EXTERN_API( OSErr )
  297. GetSpecificFreeThreadCount        (ThreadStyle             threadStyle,
  298.                                  Size                     stackSize,
  299.                                  SInt16 *                freeCount)                            THREEWORDINLINE(0x303C, 0x0615, 0xABF2);
  300.  
  301. EXTERN_API( OSErr )
  302. GetDefaultThreadStackSize        (ThreadStyle             threadStyle,
  303.                                  Size *                    stackSize)                            THREEWORDINLINE(0x303C, 0x0413, 0xABF2);
  304.  
  305. EXTERN_API( OSErr )
  306. ThreadCurrentStackSpace            (ThreadID                 thread,
  307.                                  UInt32 *                freeStack)                            THREEWORDINLINE(0x303C, 0x0414, 0xABF2);
  308.  
  309. EXTERN_API( OSErr )
  310. DisposeThread                    (ThreadID                 threadToDump,
  311.                                  void *                    threadResult,
  312.                                  Boolean                 recycleThread)                        THREEWORDINLINE(0x303C, 0x0504, 0xABF2);
  313.  
  314. EXTERN_API( OSErr )
  315. YieldToThread                    (ThreadID                 suggestedThread)                    THREEWORDINLINE(0x303C, 0x0205, 0xABF2);
  316.  
  317. EXTERN_API( OSErr )
  318. YieldToAnyThread                (void)                                                        FOURWORDINLINE(0x42A7, 0x303C, 0x0205, 0xABF2);
  319.  
  320. #if TARGET_OS_MAC
  321.     #define MacGetCurrentThread GetCurrentThread
  322. #endif
  323. EXTERN_API( OSErr )
  324. MacGetCurrentThread                (ThreadID *                currentThreadID)                    THREEWORDINLINE(0x303C, 0x0206, 0xABF2);
  325.  
  326. EXTERN_API( OSErr )
  327. GetThreadState                    (ThreadID                 threadToGet,
  328.                                  ThreadState *            threadState)                        THREEWORDINLINE(0x303C, 0x0407, 0xABF2);
  329.  
  330. EXTERN_API( OSErr )
  331. SetThreadState                    (ThreadID                 threadToSet,
  332.                                  ThreadState             newState,
  333.                                  ThreadID                 suggestedThread)                    THREEWORDINLINE(0x303C, 0x0508, 0xABF2);
  334.  
  335. EXTERN_API( OSErr )
  336. SetThreadStateEndCritical        (ThreadID                 threadToSet,
  337.                                  ThreadState             newState,
  338.                                  ThreadID                 suggestedThread)                    THREEWORDINLINE(0x303C, 0x0512, 0xABF2);
  339.  
  340. EXTERN_API( OSErr )
  341. ThreadBeginCritical                (void)                                                        THREEWORDINLINE(0x303C, 0x000B, 0xABF2);
  342.  
  343. EXTERN_API( OSErr )
  344. ThreadEndCritical                (void)                                                        THREEWORDINLINE(0x303C, 0x000C, 0xABF2);
  345.  
  346. EXTERN_API( OSErr )
  347. GetThreadCurrentTaskRef            (ThreadTaskRef *        threadTRef)                            THREEWORDINLINE(0x303C, 0x020E, 0xABF2);
  348.  
  349. EXTERN_API( OSErr )
  350. GetThreadStateGivenTaskRef        (ThreadTaskRef             threadTRef,
  351.                                  ThreadID                 threadToGet,
  352.                                  ThreadState *            threadState)                        THREEWORDINLINE(0x303C, 0x060F, 0xABF2);
  353.  
  354. EXTERN_API( OSErr )
  355. SetThreadReadyGivenTaskRef        (ThreadTaskRef             threadTRef,
  356.                                  ThreadID                 threadToSet)                        THREEWORDINLINE(0x303C, 0x0410, 0xABF2);
  357.  
  358.  
  359. #if PRAGMA_STRUCT_ALIGN
  360.     #pragma options align=reset
  361. #elif PRAGMA_STRUCT_PACKPUSH
  362.     #pragma pack(pop)
  363. #elif PRAGMA_STRUCT_PACK
  364.     #pragma pack()
  365. #endif
  366.  
  367. #ifdef PRAGMA_IMPORT_OFF
  368. #pragma import off
  369. #elif PRAGMA_IMPORT
  370. #pragma import reset
  371. #endif
  372.  
  373. #ifdef __cplusplus
  374. }
  375. #endif
  376.  
  377. #endif /* __THREADS__ */
  378.  
  379.